package com.summer.bilibili.util;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtException;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.time.Duration;
import java.util.Calendar;
import java.util.Date;

/**
 * JWT 工具类
 * 提供 JWT 的创建和解析功能，使用 HS256 签名算法
 */
public class JwtUtils {
    /**
     * 创建 JWT 令牌
     *
     * @param subject 令牌主题（通常存放用户ID等标识信息）
     * @param timeout 令牌有效期（Duration对象）
     * @param secret  加密密钥（需妥善保管）
     * @return 生成的 JWT 字符串
     */
    public static String createJwt ( String subject , Duration timeout , String secret ) {
        // 计算过期时间：当前时间 + 有效期秒数
        Calendar calendar = Calendar.getInstance ( );
        calendar.add ( Calendar.SECOND , Long.valueOf ( timeout.getSeconds ( ) ).intValue ( ) );

        return Jwts.builder ( )
                .setHeaderParam ( "typ" , "jwt" )// 令牌类型声明
                .setHeaderParam ( "alg" , "HS256" )// 签名算法声明
                .setIssuedAt ( new Date ( ) ) //签发时间
                .setExpiration ( calendar.getTime ( ) ) //到期时间
                .setSubject ( subject )// 设置主题内容
                .signWith ( SignatureAlgorithm.HS256 , secret ) // HS256算法签名
                .compact ( );
    }

    /**
     * 解析 JWT 令牌
     *
     * @param jwt    待解析的JWT字符串
     * @param secret 验证签名使用的密钥（需与生成时一致）
     * @return 包含声明(claims)的Claims对象
     * @throws JwtException 解析失败时抛出（包含签名无效、令牌过期等）
     */
    public static Claims parseJwt ( String jwt , String secret ) throws JwtException {
        return Jwts.parser ( )
                .setSigningKey ( secret )// 设置验证密钥
                .parseClaimsJws ( jwt ) // 解析并验证签名
                .getBody ( ); // 获取payload声明数据
    }
}
